/* Zatok - язык программирования текстовых игр
 * (С) 2010 - 2012 Меркулов Матвей Юрьевич
 * Код лицензирован под лицензией GNU LGPL
 * Вы можете прочитать текст лицензии по адресу:
 * http://www.gnu.org/copyleft/lesser.html
 * или прочитать русский перевод по адресу:
 * http://ru.wikisource.org/wiki/GNU_Lesser_General_Public_License
 */

package base.module;

import base.value.*;
import base.value.userobject.CMoveObject;
import java.util.LinkedList;

public class CAddTo extends CModule {
	public CIntValue IntValue = new CIntValue( 0 );
	public CFloatValue FloatValue = new CFloatValue( 0f );
	public CStringValue StringValue = new CStringValue( "" );
	public CArrayValue ArrayValue = new CArrayValue();
	
	
	
	@Override
	public void Init() {
		AssertParam( 2 );
	}
	
	
	
	@Override
	public void Execute() {
		CValue Value0 = Param[ 0 ].GetValue();
		CValue Value1 = Param[ 1 ].GetValue();
		
		switch( Value0.GetType() ) {
			case Int :
				Value0.ReplaceValue( Value0.ToInt() + Value1.ToInt() );
				break;
			case Float:
				Value0.ReplaceValue( Value0.ToFloat() + Value1.ToFloat() );
				break;
			case String:
				Value0.ReplaceValue( Value0.ToString() + Value1.ToString() );
				break;
			case UserObject:
				CMoveObject.Do( Value1.ToObject(), Value0.ToObject(), this );
				break;
			case Array:
				Value0.ReplaceValue( CArrayValue.JoinArrays( Value0.ToArray(), Value1.ToArray() ) );
				break;
			case List:
				LinkedList<CValue> List = Value0.ToList();
				switch( Value1.GetType() ) {
					case List:
						for( CValue Value : Value1.ToList() ) List.addLast( Value.Clone() );
						break;
					case Array:
						for( CValue Value : Value1.ToArray() ) List.addLast( Value.Clone() );
						break;
					default:
						List.addLast( Value1 );
						break;
				}
				break;
			default:
				Error( "Добавлять значение к логическим значениям нельзя" );
				break;
		}
	}
}
